package com.example.demo;


import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

/**
 * 1. 传递参数 : 一个参数,多个参数
 * 2. 传递对象
 * 3.参数重命名: @RequestParam
 * 4. 传递数组
 * 5. 传递集合 : @RequestParam
 * 6.从URL中获取参数  , 参数绑定：使用 @PathVariable 注解的方法参数将自动与URL中的相应模板变量绑定。
 * 7. 传递 JSON数据 , 依靠对象,@RequestBody UserInfo userInfo
 */

@RestController
@RequestMapping("/request")

public class Controller {

@RequestMapping("/param1")
    public String param1(String userName){
    return "接收到一个参数:" + userName;
        }
    @RequestMapping("/param2")
    public String param2(Integer age){
        return "接收到一个参数:" + age;

    }

//int 类型前端不传参数,会报错
    //Integer 前端不传参数,默认值为null
    @RequestMapping("/param3")
    public String param3(int age){
        return "接收到一个参数:" + age;

    }
    //同一个路径,不同的请求方式,不会报错
    //同一个路径,相同的请求方式,会报错
    @PostMapping("/param4")
    public String param4(String userName){
         return "接收到一个参数:" + userName;
    }
    @GetMapping("/param4")
    public String param5(String userName){
        return "接收到一个参数:" + userName;
    }
//    @RequestMapping("/param4")
//    public String param6(String userName){
//        return "接收到一个参数:" + userName;
//    }
//    @RequestMapping("/param4")
//    public String param7(String userName){
//        return "接收到一个参数:" + userName;
//    }
    /**
     * 传递多个参数,参数没有先后顺序,
     * 可以想象成一个Map集合,根据key ,找对应的value
     */
    @RequestMapping("/param5")
    public String param8(String userName,Integer age){
        return "接收到多个参数:" + "userName: " +userName+",age: "+age;
    }

    /**
     * 传递对象
     * @param userInfo
     * @return
     */
    //使用body(get) 传输信息,接收到的全为null,post则不是
    //使用param 则不会出现上述情况
    @RequestMapping("/param6")
    public String param9(UserInfo userInfo){
        return "接收到一个对象:" + userInfo;
    }
    @RequestMapping("/param9")

    //通过@RequestParam("userName") String name 对userName 进行重命名
    //如果前端没传userName,就会报错
    public String param9(@RequestParam("userName") String name, Integer age){
        return "接收到多个参数:" + "name: " +name +",age: "+age;
    }
//    public String param9(String userName,Integer age){
//        return "userName : " + userName +", age : "+age;
//    }

    /**
     *
     * 传递数组
     * @param arrParams
     * @return
     */
//    @RequestMapping("/param10")
//    public String param10(String[] arrParams){
//        return "接收到一个数组: "+Arrays.toString(arrParams);
//    }

    /**
     * 传递集合
     * @param listParams
     * @return
     */
    @RequestMapping("/param11")
    public String param11(@RequestParam("listParams") List<String> listParams){
        return "接收到一个list : "+listParams;
    }
    /**
     * 从URL中获取参数
     *  参数绑定：使用 @PathVariable 注解的方法参数将自动与URL中的相应模板变量绑定。
     */
    @RequestMapping("/param12/{articleId}")
    public String param12(@PathVariable("articleId") Integer articleId){
        return "接收到参数articleId :" + articleId;
    }
    @RequestMapping("/param12/{articleId}/{name}")
    public String param12(@PathVariable("articleId") Integer articleId,
                          @PathVariable("name") String name){
        return "接收到参数articleId :" + articleId + "接收到参数name :" + name
                ;
    }
    /**
     * 传递JSON 数据
     */

    @RequestMapping("/param13")
    public String param13(@RequestBody UserInfo userInfo){
      //  @RequestBody UserInfo userInfo：用于指示Spring框架将HTTP请求的body部分（即请求体）
      //  映射到方法参数 userInfo 中。UserInfo 对应于客户端发送的JSON数据的结构。
      //  @RequestBody 注解告诉Spring框架，参数 userInfo 应该被填充为请求体中的JSON数据所表示的对象。
        return "接收到参数: " + userInfo;
    }
//    @RequestMapping("/param13")
//    public String param13(@RequestBody UserInfo userInfo){
//        return "接收到参数 " + userInfo;
//     }

//    @RequestMapping("/getCookie")
//    public String getCookie(HttpServletRequest request, HttpServletResponse response){
//        //所有的接口都有这两个对象,如果需要,就加上,
//        //HttpServletRequest request,http请求
//        // HttpServletResponse response,http 响应
//        return null;
//    }

    /**
     * 1. 获取 Cookie 对象:
     *   1) : HttpServletRequest request,  request.getCookies()
     *   2) : @CookieValue("ID") String ID
     * 2. 设置 Session 对象 :HttpServletRequest request :request.getSession();
     * 3. 获取 Session :
     *   1) : HttpServletRequest request :  request.getSession(false);
     *   2) : HttpSession session
     *   3) : @SessionAttribute(value = "name",required = false )String name
     * 4. 获取 header
     *    1): HttpServletRequest request : request.getHeader("User-Agent");
     *    2): @RequestHeader("User-Agent")String userAgent
     */

    /**
     * 获取cookie 对象
     */

    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (  Cookie cookie : cookies  ) {
            System.out.println(cookie.getName()+" : " +cookie.getValue());

        }

        return "Cookie 获取成功!";
    }

    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("ID") String ID){
        //@CookieValue("ID")：用于从HTTP请求的Cookie中获取名为 "ID" 的值。
        // 如果请求中包含名为 "ID" 的Cookie，它的值将被自动注入到方法的参数中。
        System.out.println("从 Cookie 中获取ID :" +ID);


        return "Cookie 获取成功!";
    }
    /**
     * 设置 Session 对象
     *
     */
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        //有session 对象,就直接返回,没有,创建一个新的session 对象
        HttpSession session = request.getSession();
        session.setAttribute("name","zs");
        session.setAttribute("ID","11111111111");
        session.setAttribute("class","java111");
        return "Session 设置成功!";

    }
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        //参数为false , 则不存在 session 返回null
        HttpSession session = request.getSession(false);
        if(session!=null){
            System.out.println(session.getAttribute("name"));
            System.out.println(session.getAttribute("ID"));
        }
        return "Session获取成功!";

    }
    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        //HttpSession session 内置对象,需要就加上,不需要就不加
        System.out.println("name:" + session.getAttribute("name"));
        System.out.println("ID:" + session.getAttribute("ID"));
        return "Session获取成功!";

    }
    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "name",required = false )String name){
        //SessionAttribute(value = "name", required = false)：
        // 它用于从HTTP会话中获取一个名为 "name" 的属性。
        // 如果这个属性存在，它将被自动注入到方法的参数中。
        // required = false 表示这个属性不是必需的，如果会话中没有这个属性，
        // 方法仍然可以正常执行，
        // 并且参数 name 将被设置为 null。
        System.out.println("name: " +name);
        return "Session获取成功!";

    }
    /**
     * 获取header
     */
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return "User-Agent" + userAgent;
    }
    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent")String userAgent){
    //@RequestHeader("User-Agent")：用于从HTTP请求的头部（header）中获取名为 "User-Agent" 的值。
    // User-Agent 是一个标准的HTTP头部，它包含了发出请求的客户端（通常是浏览器）的信息。
        return "User-Agent" + userAgent;
    }
}
